home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / graphics / vlapak1.zip / VLAMOUSE.ZIP / MOUSE.ASM < prev    next >
Assembly Source File  |  1993-11-30  |  11KB  |  305 lines

  1. MASM
  2.  
  3. COMMENT $
  4. ─────────────────────────────────────────────────────────────────────────────
  5. ─────────────────────────────────────────────────────────────────────────────
  6.                                   MOUSE.ASM    
  7.                                   
  8.  
  9.     Well, here it is, Lithium's first tutorial!  This was the first program
  10. I wrote in assembly language, so it holds a special place in my heart.
  11. Basicly, programming for the mouse is pretty easy.  Using BIOS int 33h,
  12. there are many, many different functions at your disposal.  My book lists
  13. 52 at mouse driver 8.0  Unfortunately, my book doesn't document the registers
  14. on return from these functions.  This was written with info from a C book,
  15. but readily applies to the ASM world.  The functions used in this program
  16. will get you all the information you should need to get started with little
  17. programs using the mouse.  So, although I don't feel like exploring the
  18. world of the mouse, you can see what info you get back from these functions
  19.  
  20.  
  21. Function            Driver          Purpose
  22. ─────────────────────────────────────────────────────────────────────────────
  23.  
  24.  0                                  Reset/Initialize Mouse               
  25.  1                                  Show Mouse Cursor
  26.  2                                  Hide Mouse Cursor
  27.  3                                  Get Mouse Status
  28.  4                                  Set cursor position
  29.  5                                  Get button press info
  30.  6                                  Get button release info
  31.  7                                  Set horizontal boundaries
  32.  8                                  Set vertical boundaries
  33.  9                                  Set graphics cursor block
  34. 10                                  Set text cursor
  35. 11                                  Read motion counters
  36. 12                                  Set interrupt subroutine
  37. 13                                  Enable light-pen emulation
  38. 14                                  Disable light-pen emulation
  39. 15                                  Set mickey-to-pixel ratio
  40. 16                                  Conditional off
  41.  
  42. 17 and 18 are not listed
  43.  
  44. 19                                  Set double-spedd threshold
  45. 20                                  Swap interrupt subroutines
  46. 21                                  Get mouse driver state storage needs
  47. 22                                  Save mouse driver state
  48. 23                                  Restore mouse driver state
  49. 24                                  Set alternate subroutine
  50. 25                                  Get alternate interrupt address
  51. 26                                  Set mouse sensitivity
  52. 27                                  Get mouse sensitivity
  53. 28                                  Set interrupt rate
  54. 29                                  Set CRT page number
  55. 30                                  Get CRT page number
  56. 31                                  Disable mouse driver
  57. 32                                  Enable mouse driver
  58. 33                                  Software reset
  59. 34                                  Set language for messages 
  60.                                     (international versions only)
  61. 35                                  Get language (same restriction)
  62. 36                                  Get driver version info
  63. 37                  6.26            Get general driver info
  64. 38                  6.26            Get maximum virtual coordinates
  65. 39                  7.01            Get cursor masks and mickey counts
  66. 40                  7.0             Set video mode
  67. 41                  7.0             Get supported video modes
  68. 42                  7.02            Get cursor hot spot
  69. 43                  7.0             Set acceleration curves
  70. 44                  7.0             Get acceleration curves
  71. 45                  7.0             Set or get active acceleration curve
  72.  
  73. 46 is not listed
  74.  
  75. 47                  7.02            Mouse hardware reset
  76. 48                  7.04            Set or get BallPoint information
  77. 49                  7.05            Get virtual coordinates
  78. 50                  7.05            Get active advanced functions
  79. 51                  7.05            Get switch settings
  80. 52                  8.0             Get MOUSE.INI
  81.  
  82.  
  83. After typing all that out, I think I could have written my little program
  84. in just a couple of lines.  Oh well, it's the adventure of programming that
  85. brings the rewards...  
  86.  
  87. Lithium /VLA
  88. ─────────────────────────────────────────────────────────────────────────────
  89. ─────────────────────────────────────────────────────────────────────────────
  90. $    
  91.  
  92.     IDEAL
  93.     DOSSEG
  94.     MODEL SMALL
  95.     STACK 200h
  96.     p286
  97.     ASSUME CS:@CODE 
  98.         ;above line is for the compiler only- it creates no code
  99.  
  100. ─────────────────────────────────────────────────────────────────────────────
  101. ─────────────────────────────────────────────────────────────────────────────
  102. CodeSeg
  103.  
  104.  
  105. Message     db  "Mouse driver not present$"
  106.  
  107. Ypos        dw  100     ; Starting Y position
  108. Xpos        dw  160     ; Starting X position
  109.  
  110. OldY        dw  ?
  111. OldX        dw  ?
  112.  
  113. Yvel        dw  1
  114. Color       db  50h     
  115.  
  116.  
  117.  
  118. XMin        =   0       ; We are using a 320x200 screen
  119. XMax        =   318     ; The dot used for the pointer is
  120. YMin        =   0       ; 2x2 pixels, so these are the screen
  121. YMax        =   198     ; boundries
  122.  
  123.  
  124. ─────────────────────────────────────────────────────────────────────────────
  125. ────────────────────────────; Subroutines ;──────────────────────────────────
  126.  
  127.  
  128.     ───────────────────────
  129.     ; PROC SetMouse
  130.     ;
  131.     ; Calls the BIOS mouse int, function 0
  132.     ; This will determin if a mouse is present
  133.     ;
  134.     ; Will return AX == 0 if mouse exists
  135.     ;             AX <> 0 if not there
  136.     ───────────────────────
  137. PROC SetMouse
  138.     mov     ax,0
  139.     int     33h
  140.     inc     ax
  141.     ret         ;ax=0 successful, ax!=0 no mouse found
  142. ENDP SetMouse
  143.  
  144.  
  145.     ───────────────────────
  146.     ; PROC CheckMouse
  147.     ;
  148.     ; Will read the mouse position and place it 
  149.     ; into [Xpos] and [Ypos], it checks for boundries
  150.     ; using XMin, XMax, YMin, and YMax
  151.     ;
  152.     ; Old X and Y are stored in [OldX] and [OldY]
  153.     ;
  154.     ; If Right button pressed, [Color] = 50h
  155.     ; If Left  button pressed, [Color] = 20h
  156.     ;
  157.     ; No Registers Effected
  158.     ───────────────────────
  159.  
  160. PROC CheckMouse
  161.     pusha
  162.  
  163.     mov     ax,[Xpos]       ; Save the old X and Y 
  164.     mov     [OldX],ax
  165.     mov     ax,[Ypos]
  166.     mov     [OldY],ax
  167.  
  168.     mov     ax,11
  169.     int     33h             ; Bios int 33h function 0Bh
  170.     add     [Xpos],cx       ; returns X position in CX
  171.     add     [Ypos],dx       ;         Y position in DX
  172.     
  173.     cmp     [Xpos],XMin
  174.     jge     @@XNotToSmall   ; Don't let it go off the left side of 
  175.                             ; of the screen
  176.     mov     [Xpos],XMin
  177.  
  178. @@XNotToSmall:
  179.     cmp     [Xpos],XMax     ; Same deal with the rest of these jumps
  180.     jle     @@XNotToBig     ; we check the position against the boundry
  181.                             ; values and set them equal if they are 
  182.     mov     [Xpos],XMax     ; beyond
  183.  
  184. @@XNotToBig:
  185.     cmp     [Ypos],YMin
  186.     jge     @@YNotToSmall
  187.     
  188.     mov     [Ypos],YMin
  189.  
  190. @@YNotToSmall:
  191.     cmp     [Ypos],YMax
  192.     jle     @@YNotToBig
  193.     
  194.     mov     [ypos],YMax
  195.  
  196. @@YNotToBig:                ; So our mouse is in bounds now
  197.  
  198.     mov     ax,3            ; Bios int 33h function 3 checks the
  199.     int     33h             ; mouse status, so we can get the
  200.                             ; state of the buttons
  201.     shr     bx,1
  202.     jnc     @@RightNotPushed
  203.     
  204.     mov     [Color],50h
  205.  
  206. @@RightNotPushed:
  207.     shr     bx,1
  208.     jnc     @@LeftNotPushed
  209.     
  210.     mov     [Color],20h
  211.  
  212. @@LeftNotPushed:
  213.     popa
  214.     ret
  215. ENDP CheckMouse
  216.  
  217.  
  218.     ───────────────────────
  219.     ; PROC DrawDot
  220.     ;
  221.     ; Draws a 2x2 dot of [Color] in the X and Y
  222.     ; position of [Xpos] and [Ypos]
  223.     ;   
  224.     ; Also deletes the old dot, using [OldX] and [OldY]
  225.     ;
  226.     ; No Registers Effected
  227.     ───────────────────────
  228. PROC DrawDot
  229.     pusha
  230.  
  231.     mov     di,[OldY]       ;We will use the old X and Y to find
  232.     imul    di,320          ;Where to erase the 2x2 dot
  233.     add     di,[OldX]
  234.     mov     ax,0
  235.     stosw
  236.     add     di,318
  237.     stosw
  238.     
  239.     mov     di,[Ypos]       ;We can use the same method of our madness
  240.     imul    di,320          ;to get the position on the screen to
  241.     add     di,[Xpos]       ;draw the new dot 2x2
  242.     mov     al,[Color]
  243.     mov     ah,al
  244.     stosw
  245.     add     di,318
  246.     stosw
  247.  
  248.     popa  
  249.     ret
  250. ENDP DrawDot 
  251.  
  252.  
  253. ─────────────────────────────────────────────────────────────────────────────
  254. ────────────────────────────────; Code ;─────────────────────────────────────
  255.  
  256. Start:
  257.     mov     ax,cs       ;move CS to AX
  258.     mov     ds,ax       ;move AX to DS   
  259.                         ;this is needed because DOSFN 09h requires
  260.                         ;DS:DX to point to the start of the data to 
  261.                         ;be display
  262.     
  263.     mov     ax,0a000h   ; 0a000:0000 is the start of the VGA screen
  264.     mov     es,ax       ; We would like ES to hold that for us
  265.     
  266.     call    SetMouse    ; Do we have a mouse?
  267.     or      ax,ax
  268.     jz      @@Foundmouse
  269.     
  270.     mov     dx,offset Message
  271.     mov     ah,9            
  272.     int     21h         ; Must not if we got here, so print the
  273.     jmp     @@Bye       ; Error message before exiting
  274.  
  275. @@FoundMouse:
  276.     mov     ax,0013h    ;ah=00h al=13h Funct 00h = set video mode (al)
  277.     int     10h         ;Bios Video Interrupt
  278.     
  279. @@MainLoop:
  280.     mov     dx,03dah    ;Port that is read from
  281. @@vr1:                  ;when verticle retrace occurs bit 4 is set
  282.     in      al,dx       ;and the loop will cease
  283.     and     al,00001000b
  284.     jz      @@vr1       ;jump if zero flag is set
  285.  
  286.     call    DrawDot
  287.     call    CheckMouse
  288.     
  289.     mov     ah,1        ; We'll check for a key press
  290.     int     16h         
  291.     jz      @@MainLoop  ; A key will be the exit condition
  292.     
  293.     mov     ah,0        ; We need to grab that key, so it
  294.     int     16h         ; doesn't show up at the prompt
  295.     
  296. @@Bye:
  297.     mov     ax,0003h    ;ah=0, al=3 80x25x16 text
  298.     int     10h         ;Bios interrupt
  299.  
  300.     mov     ax,4c00h    ;DOS funtion 4ch - terminate program
  301.     int     21h         ;Standard DOS services interrupt
  302.                         ;For DOS int calls ah= function #
  303. END Start
  304.  
  305.